{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x02'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct\n",
    "struct.pack('>B',2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "47040000\n"
     ]
    }
   ],
   "source": [
    "import struct\n",
    "with open('/Users/zhoukelly/Downloads/第七周课件/MNIST_data/train-images-idx3-ubyte','rb') as f:\n",
    "    buffer = f.read(4*4)\n",
    "    head = struct.unpack('>iiii',buffer)\n",
    "    print(head)\n",
    "    length = head[1] * head[2]  * head[3]\n",
    "    print(length)\n",
    "    buffer = f.read(length)\n",
    "#   print(buffer)\n",
    "    data = struct.unpack('>{}B'.format(length),buffer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "47040000"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAOEUlEQVR4nO3dcYwV5bnH8d8jLUalENSIG9Ha22Bym0YXQUJiU6lNG4sm0JhWiHFp2mRJLAk1jam2q5DUGxujNGoicaukWLlCFS3Y1EsNS/TemDSuSBVLW6mhdMuGFTWyxEQqPPePHZoVd95Zzpk5c+D5fpLNOWeenTOPx/0xc847c15zdwE49Z1WdwMAWoOwA0EQdiAIwg4EQdiBID7Vyo2ZGR/9AxVzdxtreVN7djO7xsz+Yma7zey2Zp4LQLWs0XF2M5sg6a+SviZpQNLLkha7+58S67BnBypWxZ59jqTd7v6Wux+WtF7SgiaeD0CFmgn7BZL+MerxQLbsY8ys28z6zay/iW0BaFIzH9CNdajwicN0d++V1CtxGA/UqZk9+4CkC0c9ni5pX3PtAKhKM2F/WdIMM/ucmU2UtEjS5nLaAlC2hg/j3f0jM1smaYukCZLWuPsbpXUGoFQND701tDHeswOVq+SkGgAnD8IOBEHYgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiAIwg4EQdiBIAg7EARhB4Ig7EAQhB0IgrADQRB2IAjCDgRB2IEgCDsQBGEHgmjplM049cyaNStZX7ZsWW6tq6srue5jjz2WrD/44IPJ+vbt25P1aNizA0EQdiAIwg4EQdiBIAg7EARhB4Ig7EAQzOKKpM7OzmS9r68vWZ88eXKZ7XzM+++/n6yfc845lW27neXN4trUSTVmtkfSsKQjkj5y99nNPB+A6pRxBt1X3P1ACc8DoEK8ZweCaDbsLun3ZvaKmXWP9Qtm1m1m/WbW3+S2ADSh2cP4K919n5mdJ+l5M/uzu784+hfcvVdSr8QHdECdmtqzu/u+7HZI0jOS5pTRFIDyNRx2MzvLzD5z7L6kr0vaWVZjAMrVzGH8NEnPmNmx5/lvd/+fUrpCy8yZkz4Y27hxY7I+ZcqUZD11Hsfw8HBy3cOHDyfrRePoc+fOza0VXetetO2TUcNhd/e3JF1WYi8AKsTQGxAEYQeCIOxAEIQdCIKwA0Fwiesp4Mwzz8ytXX755cl1H3/88WR9+vTpyXo29Jor9fdVNPx1zz33JOvr169P1lO99fT0JNe9++67k/V2lneJK3t2IAjCDgRB2IEgCDsQBGEHgiDsQBCEHQiCKZtPAQ8//HBubfHixS3s5MQUnQMwadKkZP2FF15I1ufNm5dbu/TSS5PrnorYswNBEHYgCMIOBEHYgSAIOxAEYQeCIOxAEIyznwRmzZqVrF977bW5taLrzYsUjWU/++yzyfq9996bW9u3b19y3VdffTVZf++995L1q6++OrfW7OtyMmLPDgRB2IEgCDsQBGEHgiDsQBCEHQiCsANB8L3xbaCzszNZ7+vrS9YnT57c8Lafe+65ZL3oevirrroqWU9dN/7II48k13377beT9SJHjhzJrX3wwQfJdYv+u4q+875ODX9vvJmtMbMhM9s5atnZZva8mb2Z3U4ts1kA5RvPYfwvJV1z3LLbJG119xmStmaPAbSxwrC7+4uS3j1u8QJJa7P7ayUtLLkvACVr9Nz4ae4+KEnuPmhm5+X9opl1S+pucDsASlL5hTDu3iupV+IDOqBOjQ697TezDknKbofKawlAFRoN+2ZJS7L7SyRtKqcdAFUpHGc3syckzZN0rqT9klZI+o2kX0u6SNJeSd9y9+M/xBvruUIexl9yySXJ+ooVK5L1RYsWJesHDhzIrQ0ODibXveuuu5L1p556KllvZ6lx9qK/+w0bNiTrN954Y0M9tULeOHvhe3Z3zzur4qtNdQSgpThdFgiCsANBEHYgCMIOBEHYgSD4KukSnH766cl66uuUJWn+/PnJ+vDwcLLe1dWVW+vv70+ue8YZZyTrUV100UV1t1A69uxAEIQdCIKwA0EQdiAIwg4EQdiBIAg7EATj7CWYOXNmsl40jl5kwYIFyXrRtMqAxJ4dCIOwA0EQdiAIwg4EQdiBIAg7EARhB4JgnL0Eq1atStbNxvxm338rGidnHL0xp52Wvy87evRoCztpD+zZgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiAIxtnH6brrrsutdXZ2Jtctmh548+bNDfWEtNRYetH/kx07dpTdTu0K9+xmtsbMhsxs56hlK83sn2a2I/tp7tsZAFRuPIfxv5R0zRjLf+7undnP78ptC0DZCsPu7i9KercFvQCoUDMf0C0zs9eyw/ypeb9kZt1m1m9m6UnHAFSq0bCvlvR5SZ2SBiXdl/eL7t7r7rPdfXaD2wJQgobC7u773f2Iux+V9AtJc8ptC0DZGgq7mXWMevhNSTvzfhdAeygcZzezJyTNk3SumQ1IWiFpnpl1SnJJeyQtrbDHtpCax3zixInJdYeGhpL1DRs2NNTTqa5o3vuVK1c2/Nx9fX3J+u23397wc7erwrC7++IxFj9aQS8AKsTpskAQhB0IgrADQRB2IAjCDgTBJa4t8OGHHybrg4ODLeqkvRQNrfX09CTrt956a7I+MDCQW7vvvtyTPiVJhw4dStZPRuzZgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiAIxtlbIPJXRae+ZrtonPyGG25I1jdt2pSsX3/99cl6NOzZgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiAIxtnHycwaqknSwoULk/Xly5c31FM7uOWWW5L1O+64I7c2ZcqU5Lrr1q1L1ru6upJ1fBx7diAIwg4EQdiBIAg7EARhB4Ig7EAQhB0IgnH2cXL3hmqSdP755yfrDzzwQLK+Zs2aZP2dd97Jrc2dOze57k033ZSsX3bZZcn69OnTk/W9e/fm1rZs2ZJc96GHHkrWcWIK9+xmdqGZbTOzXWb2hpktz5afbWbPm9mb2e3U6tsF0KjxHMZ/JOmH7v6fkuZK+r6ZfUHSbZK2uvsMSVuzxwDaVGHY3X3Q3bdn94cl7ZJ0gaQFktZmv7ZWUvqcUAC1OqH37GZ2saSZkv4gaZq7D0oj/yCY2Xk563RL6m6uTQDNGnfYzWySpI2SfuDuB4su/jjG3Xsl9WbPkf4kC0BlxjX0Zmaf1kjQ17n709ni/WbWkdU7JA1V0yKAMhTu2W1kF/6opF3uvmpUabOkJZJ+lt2mv9c3sAkTJiTrN998c7Je9JXIBw8ezK3NmDEjuW6zXnrppWR927ZtubU777yz7HaQMJ7D+Csl3STpdTPbkS37sUZC/msz+56kvZK+VU2LAMpQGHZ3/z9JeW/Qv1puOwCqwumyQBCEHQiCsANBEHYgCMIOBGFFl2eWurGT+Ay61KWcTz75ZHLdK664oqltF52t2Mz/w9TlsZK0fv36ZP1k/hrsU5W7j/kHw54dCIKwA0EQdiAIwg4EQdiBIAg7EARhB4JgnL0EHR0dyfrSpUuT9Z6enmS9mXH2+++/P7nu6tWrk/Xdu3cn62g/jLMDwRF2IAjCDgRB2IEgCDsQBGEHgiDsQBCMswOnGMbZgeAIOxAEYQeCIOxAEIQdCIKwA0EQdiCIwrCb2YVmts3MdpnZG2a2PFu+0sz+aWY7sp/51bcLoFGFJ9WYWYekDnffbmafkfSKpIWSvi3pkLvfO+6NcVINULm8k2rGMz/7oKTB7P6wme2SdEG57QGo2gm9ZzeziyXNlPSHbNEyM3vNzNaY2dScdbrNrN/M+pvqFEBTxn1uvJlNkvSCpP9y96fNbJqkA5Jc0k81cqj/3YLn4DAeqFjeYfy4wm5mn5b0W0lb3H3VGPWLJf3W3b9Y8DyEHahYwxfC2MhXmz4qadfooGcf3B3zTUk7m20SQHXG82n8lyT9r6TXJR3NFv9Y0mJJnRo5jN8jaWn2YV7qudizAxVr6jC+LIQdqB7XswPBEXYgCMIOBEHYgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiAIwg4EQdiBIAg7EARhB4Io/MLJkh2Q9PdRj8/NlrWjdu2tXfuS6K1RZfb22bxCS69n/8TGzfrdfXZtDSS0a2/t2pdEb41qVW8cxgNBEHYgiLrD3lvz9lPatbd27Uuit0a1pLda37MDaJ269+wAWoSwA0HUEnYzu8bM/mJmu83stjp6yGNme8zs9Wwa6lrnp8vm0Bsys52jlp1tZs+b2ZvZ7Zhz7NXUW1tM452YZrzW167u6c9b/p7dzCZI+qukr0kakPSypMXu/qeWNpLDzPZImu3utZ+AYWZflnRI0mPHptYys3skvevuP8v+oZzq7j9qk95W6gSn8a6ot7xpxr+jGl+7Mqc/b0Qde/Y5kna7+1vufljSekkLauij7bn7i5LePW7xAklrs/trNfLH0nI5vbUFdx909+3Z/WFJx6YZr/W1S/TVEnWE/QJJ/xj1eEDtNd+7S/q9mb1iZt11NzOGacem2cpuz6u5n+MVTuPdSsdNM942r10j0583q46wjzU1TTuN/13p7pdL+oak72eHqxif1ZI+r5E5AAcl3VdnM9k04xsl/cDdD9bZy2hj9NWS162OsA9IunDU4+mS9tXQx5jcfV92OyTpGY287Wgn+4/NoJvdDtXcz7+5+353P+LuRyX9QjW+dtk04xslrXP3p7PFtb92Y/XVqtetjrC/LGmGmX3OzCZKWiRpcw19fIKZnZV9cCIzO0vS19V+U1FvlrQku79E0qYae/mYdpnGO2+acdX82tU+/bm7t/xH0nyNfCL/N0k/qaOHnL7+Q9Ifs5836u5N0hMaOaz7l0aOiL4n6RxJWyW9md2e3Ua9/UojU3u/ppFgddTU25c08tbwNUk7sp/5db92ib5a8rpxuiwQBGfQAUEQdiAIwg4EQdiBIAg7EARhB4Ig7EAQ/w8+sGPVrnT8WgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "imgs = np.reshape(data, (head[1], head[2], head[3]))\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "for i in range(5):\n",
    "    plt.imshow(imgs[i], cmap = 'gray')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_mldata\n",
    "mnist = fetch_mldata('MNIST original', data_home='./')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'COL_NAMES': ['label', 'data'],\n",
       " 'target': array([0., 0., 0., ..., 9., 9., 9.]),\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ...,\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X, y = mnist['data'], mnist['target']\n",
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_digit = X[36000]\n",
    "some_digit_image = some_digit.reshape(28, 28)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAANpElEQVR4nO3db6xU9Z3H8c9XLQ+UJoB3NCAutzZg1piUkgnZxE1jbbZRicE+qMIDZJMmtw/EQMSkpE2shiekrjY1MU3oQnpduzaYlgUj2a3BJoQHVkcDgiVFivyrN9wBEnv7gHSx3z64x+YCc37nMufMnIHv+5VMZuZ858z5Zrgfzsz5zZmfubsAXPuuq7sBAP1B2IEgCDsQBGEHgiDsQBA39HNjQ0NDPjw83M9NAqEcO3ZMZ86csU61UmE3s/sl/UTS9ZL+0903pR4/PDysVqtVZpMAEprNZm6t67fxZna9pJckPSDpLkkrzeyubp8PQG+V+cy+VNIRdz/q7n+V9EtJy6tpC0DVyoT9Nkknp9w/lS27iJmNmFnLzFrtdrvE5gCUUSbsnQ4CXPbdW3ff7O5Nd282Go0SmwNQRpmwn5J0+5T78yV9Uq4dAL1SJuzvSlpoZl8ysxmSVkjaWU1bAKrW9dCbu18wszWS/k+TQ29b3f3DyjoDUKlS4+zuvkvSrop6AdBDfF0WCIKwA0EQdiAIwg4EQdiBIAg7EARhB4Ig7EAQhB0IgrADQRB2IAjCDgRB2IEgCDsQBGEHgiDsQBCEHQiCsANBEHYgCMIOBEHYgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiAIwg4EQdiBIErN4grUadu2bcn6gQMHcmsvv/xy1e1c5Pjx4z19/m6UCruZHZM0IekzSRfcvVlFUwCqV8We/evufqaC5wHQQ3xmB4IoG3aX9Bsze8/MRjo9wMxGzKxlZq12u11ycwC6VTbs97j7EkkPSHrczL526QPcfbO7N9292Wg0Sm4OQLdKhd3dP8muxyVtl7S0iqYAVK/rsJvZTWb2xc9vS/qmpINVNQagWmWOxt8qabuZff48/+3u/1tJV7hmTExM5Nb27t2bXHfjxo3J+ttvv52sZ3+byHQddnc/KukrFfYCoIcYegOCIOxAEIQdCIKwA0EQdiAITnG9xl24cCFZHxsbK/X8RcNjH3/8cW7trbfeKrXtXhoaGkrWV6xY0adOqsOeHQiCsANBEHYgCMIOBEHYgSAIOxAEYQeCYJz9Glc0jj48PJysu3uyPsinkS5evDi3tmrVquS6y5YtS9YXLlzYVU91Ys8OBEHYgSAIOxAEYQeCIOxAEIQdCIKwA0Ewzn6Ne+qpp5L1onH0onqRefPm5dZGRjrOGPYPTz/9dKlt42Ls2YEgCDsQBGEHgiDsQBCEHQiCsANBEHYgCMbZrwFbt27Nre3atSu5btnz0YvWP3v2bG6t6DftDx8+nKwvWrQoWcfFCvfsZrbVzMbN7OCUZXPM7E0z+yi7nt3bNgGUNZ238T+XdP8lyzZI2u3uCyXtzu4DGGCFYXf3PZLOXbJ4uaTR7PaopIcr7gtAxbo9QHeru49JUnZ9S94DzWzEzFpm1mq3211uDkBZPT8a7+6b3b3p7s1Go9HrzQHI0W3YT5vZXEnKrserawlAL3Qb9p2SVme3V0vaUU07AHrFpvG74K9KulfSkKTTkn4o6X8kbZP0T5JOSPq2u196EO8yzWbTW61WyZbjSY2jS9KTTz6ZW5uYmCi17Tp/N37BggXJ+tGjR3u27atVs9lUq9Xq+I9S+KUad1+ZU/pGqa4A9BVflwWCIOxAEIQdCIKwA0EQdiAITnG9Cjz77LPJepnhtVmzZiXrM2fOTNavuy69vzh//nxubXw8/V2s48ePJ+u4MuzZgSAIOxAEYQeCIOxAEIQdCIKwA0EQdiAIxtmvAsuXL0/WX3rppdza6tWrc2uStGbNmmR9yZIlyXqRsbGx3NqyZcuS6+7fv7/UtnEx9uxAEIQdCIKwA0EQdiAIwg4EQdiBIAg7EATj7FeBF198sVS9Tqmfoi76meqiOq4Me3YgCMIOBEHYgSAIOxAEYQeCIOxAEIQdCIJx9szJkyeT9RtvvDG3dvPNN1fdzjUjdU560XTPRfUdO3Yk60W/AxBN4Z7dzLaa2biZHZyy7Bkz+5OZ7csuD/a2TQBlTedt/M8l3d9h+Y/dfXF22VVtWwCqVhh2d98j6VwfegHQQ2UO0K0xsw+yt/mz8x5kZiNm1jKzVrvdLrE5AGV0G/afSvqypMWSxiQ9n/dAd9/s7k13bzYajS43B6CsrsLu7qfd/TN3/5ukn0laWm1bAKrWVdjNbO6Uu9+SdDDvsQAGQ+E4u5m9KuleSUNmdkrSDyXda2aLJbmkY5K+28MeK7Fp06ZkfXR0NFmfMWNGbu2OO+5Irrt9+/Zk/Wp29uzZZH3Dhg25tYMH0/uI4eHhblpCjsKwu/vKDou39KAXAD3E12WBIAg7EARhB4Ig7EAQhB0IIswpru+8806yfvjw4a6f+8SJE8n6+vXrk/Xnn8/9AmLtik79feONN5L11PDaDTek//zuvvvuZJ1TWK8Me3YgCMIOBEHYgSAIOxAEYQeCIOxAEIQdCCLMOHsvzZo1K1kf5HH0ImvXrk3Wi37OOWXevHk9e25cjj07EARhB4Ig7EAQhB0IgrADQRB2IAjCDgQRZpy96GeJZ86cmaxPTEzk1h566KFuWuqLRx99NFl/7bXXknV3T9aLplVOee6557peF1eOPTsQBGEHgiDsQBCEHQiCsANBEHYgCMIOBBFmnP2FF15I1o8cOZKsp34f/fz588l1i8ayi2zcuDFZ//TTT3Nr586dS65bNE5+5513JuuPPfZY1/U5c+Yk10W1CvfsZna7mf3WzA6Z2YdmtjZbPsfM3jSzj7Lr2b1vF0C3pvM2/oKk9e7+z5L+RdLjZnaXpA2Sdrv7Qkm7s/sABlRh2N19zN3fz25PSDok6TZJyyWNZg8blfRwr5oEUN4VHaAzs2FJX5X0O0m3uvuYNPkfgqRbctYZMbOWmbXa7Xa5bgF0bdphN7OZkn4laZ27/3m667n7Zndvunuz0Wh00yOACkwr7Gb2BU0G/Rfu/uts8Wkzm5vV50oa702LAKpQOPRmk2MzWyQdcvep41c7Ja2WtCm7vqp/93fdunXJempa5t27dyfX3bJlS7Ley9NIFy1alKwPDQ0l66+88kqyvmDBgivuCfWYzjj7PZJWSTpgZvuyZd/XZMi3mdl3JJ2Q9O3etAigCoVhd/e9kvJ2Ld+oth0AvcLXZYEgCDsQBGEHgiDsQBCEHQgizCmuRe67775kPTWWXnQa6f79+5P1PXv2JOuvv/56sv7EE0/k1h555JHkuvPnz0/Wce1gzw4EQdiBIAg7EARhB4Ig7EAQhB0IgrADQVjRudRVajab3mq1+rY9IJpms6lWq9XxLFX27EAQhB0IgrADQRB2IAjCDgRB2IEgCDsQBGEHgiDsQBCEHQiCsANBEHYgCMIOBEHYgSAIOxBEYdjN7HYz+62ZHTKzD81sbbb8GTP7k5ntyy4P9r5dAN2aziQRFyStd/f3zeyLkt4zszez2o/d/T961x6AqkxnfvYxSWPZ7QkzOyTptl43BqBaV/SZ3cyGJX1V0u+yRWvM7AMz22pms3PWGTGzlpm12u12qWYBdG/aYTezmZJ+JWmdu/9Z0k8lfVnSYk3u+Z/vtJ67b3b3prs3G41GBS0D6Ma0wm5mX9Bk0H/h7r+WJHc/7e6fufvfJP1M0tLetQmgrOkcjTdJWyQdcvcXpiyfO+Vh35J0sPr2AFRlOkfj75G0StIBM9uXLfu+pJVmtliSSzom6bs96RBAJaZzNH6vpE6/Q72r+nYA9ArfoAOCIOxAEIQdCIKwA0EQdiAIwg4EQdiBIAg7EARhB4Ig7EAQhB0IgrADQRB2IAjCDgRh7t6/jZm1JR2fsmhI0pm+NXBlBrW3Qe1LorduVdnbAnfv+PtvfQ37ZRs3a7l7s7YGEga1t0HtS6K3bvWrN97GA0EQdiCIusO+uebtpwxqb4Pal0Rv3epLb7V+ZgfQP3Xv2QH0CWEHgqgl7GZ2v5n9wcyOmNmGOnrIY2bHzOxANg11q+ZetprZuJkdnLJsjpm9aWYfZdcd59irqbeBmMY7Mc14ra9d3dOf9/0zu5ldL+mwpH+TdErSu5JWuvvv+9pIDjM7Jqnp7rV/AcPMvibpL5Jedve7s2U/knTO3Tdl/1HOdvfvDUhvz0j6S93TeGezFc2dOs24pIcl/btqfO0SfT2iPrxudezZl0o64u5H3f2vkn4paXkNfQw8d98j6dwli5dLGs1uj2ryj6XvcnobCO4+5u7vZ7cnJH0+zXitr12ir76oI+y3STo55f4pDdZ87y7pN2b2npmN1N1MB7e6+5g0+ccj6Zaa+7lU4TTe/XTJNOMD89p1M/15WXWEvdNUUoM0/nePuy+R9ICkx7O3q5ieaU3j3S8dphkfCN1Of15WHWE/Jen2KffnS/qkhj46cvdPsutxSds1eFNRn/58Bt3serzmfv5hkKbx7jTNuAbgtatz+vM6wv6upIVm9iUzmyFphaSdNfRxGTO7KTtwIjO7SdI3NXhTUe+UtDq7vVrSjhp7ucigTOOdN824an7tap/+3N37fpH0oCaPyP9R0g/q6CGnrzsk7c8uH9bdm6RXNfm27v81+Y7oO5JulrRb0kfZ9ZwB6u2/JB2Q9IEmgzW3pt7+VZMfDT+QtC+7PFj3a5foqy+vG1+XBYLgG3RAEIQdCIKwA0EQdiAIwg4EQdiBIAg7EMTfAa5yOtysgto/AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 建立测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([58833,  6519,  3429, ..., 36487, 17432,  1568])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将数据集合交叉洗牌，交叉验证时，每个子集合数据分布均匀，有些机器学习算法对训练实例的顺序敏感\n",
    "import numpy as np\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       ...,\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5 = (y_train == 5)\n",
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False, False, ...,  True, False,  True],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       ...,\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ...,  True, False, False],\n",
       "       [False, False, False, ..., False, False, False]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5.reshape(20, -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_5 = (y_test == 5) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SGD 梯度下降 分类器\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(random_state = 42)\n",
    "sgd_clf.fit(X_train, y_train_5)\n",
    "\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 性能考核"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.9641 , 0.96545, 0.9301 ])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把每张图都分类成 非5\n",
    "from sklearn.base import BaseEstimator\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass\n",
    "    def predict(self, X):\n",
    "        return np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False],\n",
       "       [False],\n",
       "       [False],\n",
       "       ...,\n",
       "       [False],\n",
       "       [False],\n",
       "       [False]])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.91105, 0.9098 , 0.9081 ])"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "never_5_clf = Never5Classifier()\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[52738,  1841],\n",
       "       [  966,  4455]])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_perfect_predictions = y_train_5\n",
    "confusion_matrix(y_train_5, y_train_perfect_predictions)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 正类预测的准确率 被称为分类器的精度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度和召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7075921219822109"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "precision_score(y_train_5, y_train_pred) # 4327 / 4327 + 1276"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8218040951853901"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred)    #  4327 / 4327 + 1094"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7604335580780063"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "### 谐波平均值会给予较低值更高的权重\n",
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精度/召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([45031.25087597])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 返回决策值decision_function\n",
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,\n",
    "                             method=\"decision_function\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "##计算所有可能的阀值的精度和召回率\n",
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib 绘制精度和召回相对于阀值的函数图\n",
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-700000, 700000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通过选择阀值来实现最佳的精度/召回率权衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 目标设定为90%的精度，阀值大概在150000左右 , 设置了阀值为150000\n",
    "y_train_pred_90 = (y_scores > 150000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9067961165048544"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6030252720900203"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ROC 曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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7/fz97//nc6dO5Ofn098fDxXXXWVZlRrmXCXfiKw/6T6HqBJBcd8ApwE/AlYFTruF4wx14am/7N37txZ5Ref9vGPAFzSRTdwEBGpLps3b6Zfv35MmjSJrKxqm5yVGhDu0i8A4kOPkw7z+ncD11lrJwOrgTGHHmCtnWatzbLWZlV12mhXQSn5JT4Arurd8uiTi4jIr7z++utkZGSwbNkyZs6cyQsvvEBysmZSa6twl/4yfp7SzwDWV3BMKtDRGOMFugO2Ol74qQ/XAtC2aTIpCdruUUTkeAUCAR566CFOOukkli9fzqhRo5yOJJUI93X6rwEfG2PSgfOBocaYKdbag1fy/wN4juAU/+fA7Op44emfrANgWDct4BMROR6rV6+mYcOGpKWl8corr1C/fn1iY2OdjiVVENaRvrU2j+Bivi+Ac6y1OYcUPtbaJdbaDtbaJGvtAGttwfG+7rbQin2AK7JOON6nExGJSNZaZsyYQdeuXbn55psBaNy4sQq/Dgn7dfrW2r3W2rnW2m3hes252cELAFo1SiQhJuI2IRQROW65ublceeWVXH311XTv3p0HHnjA6UhyDCJiR76l64MXAJxzWmOHk4iI1D0rV64kMzOT//znP0yZMoX33nuP9PR0p2PJMXD9sLfcH+DjNbsAGHyGpvZFRI5W48aNadKkCS+88AK9evVyOo4cB9eP9Fdszj3w+LQmuoxERKQqtm/fzq233orP5yMtLY1PP/1Uhe8Cri/9JeuCU/vntmuinaFERKpg/vz5dOrUiccee4zly5cD6OenS7i+9L/fng8Er88XEZHDKysr49Zbb+W8884jLS2NpUuX0q1bN6djSTVy/Tn99bsLAeh5ckOHk4iI1G5jxozhpZdeYty4cUydOpWEhASnI0k1c3XpW2v5cuM+ANJT4is5WkQkMvn9frxeL3/5y1/43e9+x2WXXeZ0JKkhri79xet+vlfPiQ30G6uIyMEKCwv505/+RExMDE899RSZmZlkZmY6HUtqkKvP6a/YHBzl92zdEK9Hi1BERPbLyckhKyuL5557jgYNGmBttdzmRGo5V5f+yq15AFzYqZnDSUREagdrLY8//jjdu3cnNzeXBQsWcO+992p1foRwdem//tVWANqn13M4iYhI7bBlyxZuv/12+vfvT05ODv369XM6koSRa8/pl5T7MQashTaNk5yO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m28yZMgQp2OJiIhLuKL03bIj35QpU7j66qvp3r07OTk5XHjhhU5HEhERF9FCvlrAWosxhuHDhxMTE8Nf//pXvF6v07FERMRlXDHSr6sCgQAPPfQQgwcPxlpL69atue2221T4IiJSI9xR+nVwdn/79u1ccMEF3HrrrQQCAUpKSpyOJCIiLueO0q9j5s+fT0ZGBosWLeLpp5/mv//9L/Hx8U7HEhERl3PFOf26NNAvKipi9OjRNGzYkAULFnD66ac7HUlERCKEK0q/Lti0aRPp6ekkJCTw7rvvcvLJJ5OQkOB0LBERiSCumN6v7Teeefnllzn99NN54IEHAOjYsaMKX0REws4VpV9bFRYWMnbsWIYOHUqHDh248sornY4kIiIRTKVfQ77++muysrKYMWMGd9xxB4sWLaJly5ZOxxIRkQjminP6tXFyv7i4mKKiIhYsWEC/fv2cjiMiIqKRfnXavXs3M2bMAKBbt26sWbNGhS8iIrWGK0q/Nqzj++ijj+jcuTN/+MMfWL9+PQAxMTHOhhIRETmIK0rfST6fj0mTJnHOOecQHx/P559/rnP3IiJSK7ninL5TrLX85je/4Z133mHkyJE88cQTJCcnOx1LRESkQq4ofaem940xXHnllQwbNoyRI0c6E0JERKSKXFH64VRSUsItt9xCZmYmY8aMYcSIEU5HEhERqRJXnNM3Ybpob9WqVXTv3p3HH3+cH374ISyvKSIiUl000q8Cay3PPfccN954IwkJCbz11ltccMEFTscSERE5Kq4Y6de07Oxsrr76arp3705OTo4KX0RE6iRXjPRraiHfzp07SUtL44wzzmDevHmce+65eL3emnkxERGRGqaRfgUCgQAPPvggLVu2ZOnSpQCcd955KnwREanTXDHSr07bt29n1KhRzJ8/n8suu4xTTjnF6UgiIiLVQiP9g8yfP5+MjAw++ugjnn76af7zn/+QmprqdCwREZFqoZH+QT7//HMaNWrE+++/T4cOHZyOIyIiUq1cMdI3x7GS78cff+TTTz8FYMKECSxdulSFLyIiruSK0j9Ws2fPpnPnzowdOxa/34/X6yU+Pt7pWCIiIjXCFaV/tOP8wsJCrrrqKq688ko6duzIvHnztDJfRERcL+LO6e/cuZOzzjqL77//ngkTJnD33XcTFRVx3wYREYlAEdd2jRo14pxzzuGpp57inHPOcTqOiIhI2Lhjer+S+f3du3czfPhwfvzxR4wxKnwREYlIrij9I1m0aBEZGRn85z//ObC7noiISCRyRelXdGtdn8/HpEmT6NevHwkJCXzxxRcMGTLEgXQiIiK1gytKvyJTp07l73//OyNGjGDZsmVkZmY6HUlERMRRrlvIV1BQQFJSEn/84x85+eSTueyyy5yOJCIiUiu4YqRvDJSUlHDDDTfQrVs3CgsLSUxMVOGLiIgcJOylb4yZboz53Bgz4XiOOdjGH9fQvXt3nnjiCQYNGqTr7kVERCoQ1tI3xvwO8FprewKtjTFtjuWYg/mL8rhp6CC2bt3KW2+9xdSpU4mNja2ZL0BERKQOC/dI/2xgbujxfODMYzzmgEBxLm07dSUnJ4cLLrigmmKKiIi4T7jnwROBLaHHe4CKltRXeowx5lrg2tCbpTlLPvmmefPm1RxVDtEIOt9f5wAACO9JREFU2OV0CJfT97jm6Xtc8/Q9Do/TjuWTwl36BcD+29glUfFMQ6XHWGunAdMAjDHZ1tqs6o8qB9P3uebpe1zz9D2uefoeh4cxJvtYPi/c0/vL+Hm6PgNYf4zHiIiIyFEK90j/NeBjY0w6cD4w1BgzxVo74QjH9AhzRhEREVcK60jfWptHcKHeF8A51tqcQwq/omNyK3naaTUQVX5N3+eap+9xzdP3uObpexwex/R9Ntba6g4iIiIitZArduQTERGRytWZ0q+Jnfzklyr7/hlj6htj3jHGzDfGvGqMiQl3Rjeo6n+nxpgmxpgvw5XLTY7ie/ykMebicOVykyr8vEg1xrxtjMk2xvw73PncIvRz4ONKjqly99WJ0q+Jnfzkl6r4/RsOTLXWDgS2AYPCmdENjvK/04f5+fJV+f/t3X+s1XUdx/Hn616uXC0S0gRrGDWaPylgBVqrLirDHytx1hxpgawZzlTUrYSNtLayHxuLQlxYWi0zywq7Ky0oKVthaYsiaeYKR2A/FymCEPLuj8/nXL6c7uV8D/feQ+d7X4/tjHO+38/5ng8fDuf9/X4+38/7U1LZNpb0ZmBCRPS2tIIVULKN3w3cnafvjZHkaXxNkjQO+BIpf81AZZqKfW0R9BmGTH72P3po0H4RsSoi1uaXLwP+1pqqVUoPJb6nks4GniOdXFlzemjQxpK6gDuALZIual3VKqOHxt/jfwJnSBoLTAS2tqZqlfICcCnwzCHK9NBE7GuXoF+fpW/8YZaxgZVuP0lnAeMiYkMrKlYxDds5D5ssA25qYb2qpMx3+T3A48AngRmSrmlR3aqiTBv/FHglcC2wOZezJkTEMyVmsDUV+9ol6A9JJj87pFLtJ+mlwGeBhS2qV9WUaeebgFURsaNltaqWMm08DVgdEX8BvgLMalHdqqJMG98MLIqIjwC/B65oUd1GmqZiX7sERmfyG34N2y9fgX4DWBIRT7WuapVS5nt6LnC1pPXAVEmfb03VKqNMGz8JvDo/fz3g73NzyrTxOGCKpE5gJuD54cOjqdjXFvP0Jb0EeBj4ITmTH/DOYmKffsqcWaJbxLKSbXwV8DFgY950e0Tc2+q6trMy7VxXfn1E9LSuhu2v5Hd5DHAnqSu0C3hHRGzr53DWj5JtPAO4i9TF/3Pg4ojYeQSq2/ZqvwOSTgPeNZjY1xZBH/ruYpwN/CR3yR1WGRuY26813M7Dz208/NzG/z+a+bdom6BvZmZmg9MuY/pmZmY2SA76ZmZmI4SDvpkNO0mdknSk62E20jnom1WEpLmS3jjAvu7hXCtB0hxJNxZe3yrp+4UiHwJ68/StMse7LCeBMrMhNOpIV8DMhswy4EeSlpPmRdcsASYB8yQFKYHH1RHxOQBJ04DnaTyPuhPoBn4bEXvr9v0bWCrphIj4ILAH2J2PfwHwAdJUoxeKb8rpcEcBeyJif2HXQmAX8LZC2U7gKGB/ROxpUFcz64eDvlkFSDoJmAK8HZgBzIqI9ZK+SAqoi4BFuex6Uhavmg2kIF0MukeRAnwx53dH3n4yOZmNpNGAgF8AFwIr8hz4ohuAqyKitjJjR0Q8n/ddCqwEdkuqBfIu0gnIPklbCsfpAo4hLUT00VINY2YHcdA3q4b5wGMRsS1fzTfSd8UdEaPrd0paANwSEZMaHOcTwHV12/pOFAp1OUfSXfn5/cDc/Pye/OeDEfGP/J57gLG5zFTglxGxP68ediEpDbSZHQaP6Zu1OUmjgPeSrtZrHsoBdz7QLWmdpGcl7SCl7Bxwqc4m3QIcB3RFhIDJwNPAE6TgfirwHdLwQgep92Be4f1HA2cCT0iaLek+YAIpb/tS4MfA+ZIWAo8CJ+ZjmNlh8JW+Wfu7gjROXzQrItbXXkhaQeq+3xP9ZOSSdB2wKyLuaOaDi4sC5eWAv5ofz5IWtdlJOsHYBNwYEavr3r8TeL+k1cBe4BJST8Fa0gnBxRHx3XzfwfyIWNNM/czsYL7SN2tjeSz/48CqAfZ3SzqBtJTsPGC+pAWSzqgrOht4S922DkljC4/jJZ3Yz2e8LnfJ9wK3RsQNpLH/0RHx53zsm4HbJPXm+tR7DthBui/hbNJ9ApcDr5A0nbQ2+2RP+zMbHAd9s/a2nRRQH6vbXuve3w1MBD4FXEYaJ18OvKau/D4K4/zZROBfhcffgQeKBSS9AfgV6Qa7qRGxolCvHZI6I1lOWgzkJOp+dySdDzwCnEPqFbifdPf+N4E5pIVxJpFmIdwn6ZhGjWJm/XPQN2tjEbEvIlb2s2tWHmM/mhSUvwesjIi5pG70R0sc/qmIUO1Bunu+Pg/AJuD0iLgoIv5Qt28GhRkBEbEub+ubOSBpKfBlUk/EZtJqbGOAz5CmAc4ETgemk5bAfS3pjn8zOwwe0zerqNwVXusOXwecJ+k3pLH7rc0eLyL2kXoEih4A3nqIXvf9A+yTpA7ga8DXI+LJvHEmaT3wLwB/jIjFeYnWrRHxtKSpQOQehPqeCTNrwEHfrJoeKjx/FfAtUla8AG4bws+5IB+zL7mOpJOBXwPbgN6IuL5WOM/Tr00RnEIaltgrqT7Zz4tIJwwLCu+FA7kC5pDu7DezJjjom1VTLTlPF7AvIkLSD0hj5ROG6kMiYlfxtaSXA3eTuuw/DPws9zgsiYjdOZPf3vzejQzwGyRpDbAlIhYPVV3NzGP6ZlXRyYH/z121jRHxH+DFkpYB5wEbgTsljc+L4EyVdCppyt+xkk6RdAppPnxX7XV+nJbLT67/cEnHSbqedIW/Gbg2IrYDZ5HG4jdJukbSscPXBGbWiK/0zaqhmwNJa/oy7OUFeB4k3RE/nXQX/qeBx0k3xT3CwXn3N9Qdt/51Vz7eJfn4i0lTAacBvwPeFxHfrhXO4/A9wJWkRD7LJd0bEZc3+PsUT2LMbIionzwdZlYhksZHxF/rth1fS3s7yGO/CTgXWJO76w9VdjRpyuD2iHi4Qdm1wJ8i4srB1tHMDnDQNzMzGyHcfWZmZjZCOOibmZmNEA76ZmZmI4SDvpmZ2QjhoG9mZjZCOOibmZmNEP8FK8ZC3LlhVe8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('假正类率', fontsize=16)\n",
    "    plt.ylabel('真正类率', fontsize=16)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.95760565439551"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算曲线下面积AUC\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练随机森林分类器，比较SGD分类器的ROC曲线和ROC AUC分数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(n_estimators=10, random_state=2)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,\n",
    "                                    method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0.],\n",
       "       [1., 0.],\n",
       "       [1., 0.],\n",
       "       ...,\n",
       "       [1., 0.],\n",
       "       [1., 0.],\n",
       "       [1., 0.]])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_scores_forest = y_probas_forest[:, 1] \n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., ..., 0., 0., 0.])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ddg3+olZW/Rfp+Ove39CuNvu3Vp//rnW8Rn+2S5bpvUjj2j911/Otqee0trHR+u5c51tgwZpDVoPGeJsW7/etLVo4WxLTjZtpUpp/ccfzvagIK0DArROSHC2DRyodZ06Wm/e7Gz77DOtn31W6507nW1Hjmi9caPW589f968uhC2kpKToyMjIf78/cOBArl4HROjrqJmFsqefmJLKjO8P8OHGAySlOigd4MfIjjV4tG4VmXEtXCYuzvROixY1Pen0ti++ML2/9Et+4uPhtddMT/Htt01b+vXJgYFmuNnPz7Q3bmwmZ2W8tOnTT+HLL81lR5Uqmf1obXrYSUnOPG3amPPlGXvLVauac98ZJ3B5e8MHH5jnZco42zMOmaebOfPqts6dr+6p33ST889AiMLq2LFj9OzZk61bt7J//35uueUWqmecEekK1/NJoSB95bWnv+XAGX3/2xv/7d0P+eQXfS4+MU/7ECKjH37QesQIrQ8eNN9fvqx1166md/zpp87t3n3XtL3xhuk9a631ypWmLSzMud25c86edbrUVK2rVDHtGXvH/ftrHRys9YYNzrZPPtF67Fiz73SXL5uv1NR8+7WFEDfg66+/1mXKlNHFihXT8+bN0w6HI0+vR3r613Y+IYkJq/bySeRRAKqXC2BCp9o0rl4mh1eKwuDHH00v+P77nTOdZ8401xsPHGgmXf39t1l4Y8sWc466TRvzmiFDYNs2c7761lvN69M/rEdFQfPmULasOW9ctapZ6CM11ZxTvusuc51wuQzragUEmP0XLeps8/Iyk8JKlrxyMtacOVf/Lo89dnVb+jl3IYS1tNa88sorvPvuu9StW5elS5dy5513uu34ti/6Wmu+2HmMcSv3ci4hCT9vL565/zaebnGbTMKzuQsXTNH18rry2uvgYDOknXHRkdatTQG/dMm59OaUKaZAN2liin7lymaIfP9+MxEMzDB7nz5m2D59yN3XFwYPht69zRB2+szvPn3MV0bVq8PmzVe2+fmZa7Mzc/WonxDC9ZRSeHt788ILLzB58mSKpL/huOv4ZpTAc11rGd6DZxIYsWI3P/15FoDG1UszvlNtbitX3J0RRT5LTjbXSler5jyPvXatmakdFmYWTwFzLXSVKldfe62U6Vl/+qm51ArMNdopKWa/6T3sd94xs9VnzHCuArZnj3m8+eYrL+MSQojs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WrOcb0VFBbNmzaJz58506tSJWbNmUeHTJ7x161ZEhHPnzrF48WISEhJqdH2cPXuWefPmERsbS0xMDFlZWZw8edL7+cmTJ5k0aRJdu3YlOjqasWPHcvToUQByc3MREe655x4+++wz73iD3NzcZjm3JlHVFv0Ij0vS36z5XIPlpZde0t///vdBO74xpnl9+OGHwQ6h2eTl5anzZ96xb98+7dOnj958883e92644Qbt37+/bt68WV999VXt3Lmz5uXlqapqcXGxAtq/f3+dOXOmbtq0SVNTUzUlJUVVVc+ePau9e/fWIUOG6IYNG3TRokUaFhamPXv29O7/xz/+sX7/+9/XtWvX6ooVK7R9+/b6i1/8wnvsDh066Jo1a3TAgAHapk0bzcvL0+HDh+vIkSPrPb/q+N5+++0Llrn33ns1Li5O//jHP+rq1as1NjZWp02b5v387bffVkCnTZumAwcO1F//+tdaVFTk/XzevHkaGxurL7/8sr755puamJioGRkZ3s9nzZql8fHxunbtWn399dc1OTlZp06dqqqqJSUlWlBQoDk5Odq9e3ctKCjQgoICLSkpqffc6vseAju1CTnTFX36X3wRuGOVl5czZ84cUlNTueeee5g4cWLgDm6MCYqER9YFOwQADvzbLU3aznep79TUVF544QXAueibMGEC1113Hf369aOyspLly5fz3nvvkZWV5d2mb9++/Pa3vwVg/vz53HnnnYBzH5H9+/ezfv16EhMTGT58OIWFhfz1r38FYPv27WzcuJHCwkJSUlIAZynyBQsW8NBDDwFw1113MXbsWNauXUtsbCxZWVkUFxeTn5/f4PNLT0+v8bq4uJiEhAQOHjzICy+8wJo1axgzZgwAERERjBs3juzsbC677DLvNkVFRWzfvr3GWKyysjKWLVvGc889x/jx4wE4duwY9957L+Xl5URGRnLw4EEGDBjA6NGjAejduzdfffUVAPHx8cTHx7Nv3z7Cw8MviXEHrmjeT0wKzHGKiooYPHgwTz/9NJ988klgDmqMMRepsLCQdevWISLMnTuXyy+/HHB+DIwfP5633nqLW265hdjYWLZu3UpZWVmN7adNm+Z9HhMTQ2VlJQD79++nc+fOJCYmej+//vrrvc93795Nx44dvQkfnCb90tJS79/Q7t27e2Pxfd4Yzz//PIWFhd5HfHw8AHv37qWq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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(fpr, tpr, \"b:\", linewidth=2, label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\", fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9934435346242876"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.983512859969224"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)\n",
    "precision_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8253089835823649"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多类别分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-149040.54385465, -445040.4182593 , -380951.75522529,\n",
       "        -156670.86454465, -432499.25635486,   45031.25087597,\n",
       "        -865194.21687094, -248460.13195927, -741682.48964093,\n",
       "        -492159.48364658]])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.argmax(some_digit_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.classes_[np.argmax(some_digit_scores)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用OvO策略，一对一或者一对多\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(max_iter=5, tol=-np.infty, random_state=42))\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "ovo_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(ovo_clf.estimators_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用随机森林\n",
    "forest_clf.fit(X_train, y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.87282543, 0.84939247, 0.86632995])"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.9145171 , 0.90639532, 0.90788618])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 错误分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n",
      "/Users/zhoukelly/opt/anaconda3/lib/python3.8/site-packages/sklearn/linear_model/stochastic_gradient.py:123: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[5734,    2,   21,    9,   11,   51,   47,    7,   38,    3],\n",
       "       [   2, 6490,   48,   20,    6,   46,    8,    9,  100,   13],\n",
       "       [  61,   37, 5329,   90,   92,   22,   88,   56,  168,   15],\n",
       "       [  53,   38,  144, 5303,    3,  252,   44,   62,  137,   95],\n",
       "       [  23,   28,   34,    9, 5383,    8,   58,   26,   70,  203],\n",
       "       [  65,   42,   36,  174,   70, 4636,  122,   29,  166,   81],\n",
       "       [  38,   25,   41,    1,   42,   89, 5635,    7,   40,    0],\n",
       "       [  24,   19,   72,   23,   56,   10,    4, 5814,   14,  229],\n",
       "       [  50,  161,   71,  161,   13,  165,   62,   26, 4999,  143],\n",
       "       [  44,   36,   23,   89,  183,   39,    2,  205,   75, 5253]])"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPkAAAEACAYAAABxpdD1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAKZElEQVR4nO3dX4ildRnA8e/j7AwuZbZDpuSqsNBVLroxaELGKhV1oVIZhqJgxWKIXislkhcFIt0EK05ZN9o/Lwr8ExjBkgtKjMiysBp64SILi+WmpbDKzDxd7Miazu55Z/f9nXfOM9/P1bhz/M3Dcb++58yc80xkJpLqOmPoASS1ZeRScUYuFWfkUnFGLhVn5FJxRt5BRJwdEX+OiKcj4o8RMTP0TF1ExLkR8cLQc6xFROyOiGuGnqOLiNgSEU9FxEJEPDT0PCcySOQR8XBEPBsRPxri65+Cm4CfZeZXgcPA1waep6sHgM1DD9FVRFwJnJeZjw89S0c3A49m5hxwVkTMDT3QasYeeUR8E5jKzCuAbRHx2XHPsFaZuTsz/7Lyj+cArw85TxcRcTXwDsf+p7TuRcQ08Avg1Yi4buh5OnoDuDgiPglcALw28DyrGuJKvhP4w8rHTwNfHGCGUxIRVwBbMvO5oWc5mZWnE/cAdw09yxrcAhwA7gcui4g7Bp6ni73ARcCdwIvAkWHHWd0QkX8MOLTy8RHg3AFmWLOImAV+Dnx36Fk6uAvYnZlvDj3IGuwA5jPzMPAIcNXA83RxL3BbZt4HvATcOvA8qxoi8rc5/jzx4wPNsCYrV8bHgLsz8+DQ83TwZeD2iNgDXBoRvxx4ni5eAbatfDwHTML9vAXYHhFTwOXAunwjSIz7DSoRcQvw6cx8ICJ+DPwjM38z1iHWKCJ+APwE2LfyRw9m5u8HHKmziNiTmTuHnmOUiDgL+BXHHtlNA9dn5qGT/1vDiojLgF9z7CH7s8A3MvPtYaf6qCEi/wTwDPBX4OvAFzLzrbEOIW0gY48cjv18EfgK8LeV52CSGhkkcknjs+6/6SXp9Bi5VNxgkUfErqG+9qly5vYmbV5Y/zMPeSVf13fMCThze5M2L6zzmX24LhXX63fXZ2dnc+vWrZ1ue+TIEWZnZzvddv/+/aczlrQhZGas9ueb+vwiW7du5cknn+zzSAAuvPDC3s/UR51xRpsHdi1/TNvq7IhVe+nFuH9s7cN1qTgjl4ozcqk4I5eKM3KpOCOXiusU+QRuV5W0YmTkk7hdVdJxXa7kO5nQ7aqSukV+0u2qEbFr5TdILBw5si430kobWpfIT7pdNTPnM3MuM+e6vhZd0vh0ifx5jj9EvwR4tdk0knrX5Q0qfwKeiYjPsLJdte1Ikvo08kqemf/h2DffngOucn2yNFk6vdU0M//N8e+wS5ogvuJNKs7IpeKMXCrOyKXiel3kGBFNlle13Ik1iXvNWmm112wS74upqalmZy8tLTU590SLHL2SS8UZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvFGblUXKffhbYWLVYct1qbDLBv374m5+7YsaPJuS21WhXccr1xq3XPk7iS+US8kkvFGblUnJFLxRm5VJyRS8UZuVSckUvFGblU3MgXw0TE2cDvgCngHeCGzHyv9WCS+tHlSn4T8LPM/CpwGPha25Ek9WnklTwzd3/gH88BXm83jqS+dX7tekRcAWzJzOc+9Oe7gF19DyapH50ij4hZ4OfAtz78ucycB+ZXbtfm3QKSTtnI5+QRMQM8BtydmQfbjySpT12+8fY94PPADyNiT0Tc0HgmST3q8o23B4EHxzCLpAZ8MYxUnJFLxRm5VJyRS8UZuVRc9LntMiKyxWbVVhs5ATZt6n1hLQALCwtNzgW45JJLmpy7efPmJucePXq0ybkAEdHk3JbbWpeXl3s/c2lpicxc9c7wSi4VZ+RScUYuFWfkUnFGLhVn5FJxRi4VZ+RScUYuFWfkUnFGLhVn5FJxRi4VZ+RScUYuFWfkUnFGLhVn5FJxRi4VZ+RScUYuFWfkUnG9r2Tu7bD/P7fFsU21XCO9f//+Judu3769ybkt1nS/r9X93PLv3MzMTO9nvvvuuywvL7uSWdqIjFwqzsil4oxcKs7IpeKMXCrOyKXiOkUeEedGxAuth5HUv65X8geANr+8WlJTIyOPiKuBd4DD7ceR1LeTRh4RM8A9wF3jGUdS3zaN+PxdwO7MfPNEr+WNiF3Arr4Hk9SPUQ/XvwzcHhF7gEsj4pcfvkFmzmfmXGbOtRhQ0uk56ZU8M7/0/scRsSczv99+JEl96vxz8szc2XAOSY34YhipOCOXijNyqTgjl4ozcqk4I5eK631ba4vNnC03n7YyPT3d7OzFxcUm5z7xxBNNzr322mubnAuwtLTU5NyW//1azLy0tERmuq1V2oiMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXijFwqzsil4oxcKs7IpeKMXCrOyKXiet/WeqLfY346Wm5rbTEvTObMLTbtArz88stNzgXYtm1bk3Nb3cfQ7u+G21qlDcrIpeKMXCrOyKXijFwqzsil4oxcKs7IpeI6Rx4RuyPimpbDSOpfp8gj4krgvMx8vPE8kno2MvKImAZ+AbwaEde1H0lSn7pcyW8BDgD3A5dFxB0f/GRE7IqIhYhYaDGgpNPTJfIdwHxmHgYeAa764Cczcz4z5zJzrsWAkk5Pl8hfAd5/q88ccLDdOJL6tqnDbR4GfhUR3wGmgevbjiSpTyMjz8z/At8ewyySGvDFMFJxRi4VZ+RScUYuFWfkUnFGLhXX+0rm3g4bk1ZriJeXl5ucC5M5cyuHDh1qcu7555/f5FyAzZs3937m0aNHWV5ediWztBEZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvFGblUnJFLxRm5VJyRS8UZuVSckUvF9b6tNWLVhZGnZXp6uvcz37e4uNjk3E2buvzC2FPz3nvvNTl3Zmamybmt7mOAPv/+ftDevXubnAuwc+fO3s9cXFx0W6u0URm5VJyRS8UZuVSckUvFGblUnJFLxZ008ojYEhFPRcRCRDw0rqEk9WfUlfxm4NHMnAPOioi5McwkqUejIn8DuDgiPglcALzWfiRJfRoV+V7gIuBO4EXgSPOJJPVqVOT3Ardl5n3AS8CtH75BROxaec6+0GJASadnVORbgO0RMQVcDnzk3QCZOZ+ZcyvP2yWtM6Mi/ykwD7wFzAK/bT6RpF6d9P2Qmfl34HNjmkVSA74YRirOyKXijFwqzsil4oxcKs7IpeKMXCpuIlYyt9Rqpe/U1FSTc6HduudWq55b3ccAZ555ZpNzW90XAM8//3zvZ954440cOHDAlczSRmTkUnFGLhVn5FJxRi4VZ+RScUYuFWfkUnFGLhVn5FJxRi4VZ+RScUYuFWfkUnFGLhVn5FJxRi4VZ+RScUYuFWfkUnFGLhXX97bWfwIHO978U8C/evvi4+HM7U3avLA+Zr4oM89Z7RO9Rr4WEbGQmXODfPFT5MztTdq8sP5n9uG6VJyRS8UNGfn8gF/7VDlze5M2L6zzmQd7Ti5pPHy4LhVn5FJxRi4VZ+RScUYuFfc/yANHQtQkkQ4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.matshow(conf_mx, cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用0填充对角线 只保留错误，重新绘制\n",
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 如何优化分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Yu+jJ+rnAp/z4nK5hF27dgn33HOPEB4eLshkMkEikQgSiUSQSqWCVCoVgoODBbVaLajVaiEiIkJQqVTiMc9HJpMJjz32mFBVVXWhS102DodDGBoaEn74wx8KBQUFQlJSknDrrbcKvb29gtvtFs9zu92Cy+USbDab8POf/1woKSkRAEEikQibN28WXn311WnnXy4Gg0E4evSo8PWvf10oKSkRCgsLBYlEIgDnfKRSqRAVFSXcf//9wttvvz1jMlwqn376qfDAAw8ISqVS2Lx5s/Dyyy8LVVVVwuDgoGCz2QSXyyU4nU5haGhI+OSTT4TnnntO2LJli5CamipERUUJarVaeOONN4SWlpYZl+3w4cNCdna2oFAoBIlEIgQEBAi333678O1vf1u45557hMTERPHYmR9/f38hPDxc+M///E9hz549n/eyFxs3V+pnxnG73cLf/vY3QalUClKpVHjggQeE/fv3e+NSF8VmswmDg4PCo48+Kr4TKSkpwocffij09vZ6/foOh0P4xS9+IVx33XVCRESEIJVKxfftzPF85lypVCqFwsJC4de//rVw4MABweVyzahMer1e+NnPfiZkZGRccH65lI9EIhGee+454eTJkzMq30xgs9mE4eFh4f333xe+853vCKtWrRIiIiKElJQU4Ve/+pUwPj5+sX9x3vEiET7bUXnBg57C4adOneK3v/0tHR0djIyMiAXGz+xNJgjCtOolniopt99+u9iZ21v5ZZOTk2i1WjZu3MjIyAgulwulUsmaNWtYsmQJy5YtQyaTcfLkSbF4dl1dHUajEbvdzu23386tt97KunXrZjR/a2Jigvb2dr7xjW8wMDAgJrWeiVQqJS0tjUWLFvHggw+Snp6OWq2e9Z6JZrOZgwcPsn37drZt2yaGW4eEhDBv3jwUCgUul4vW1lbGx8fFHNZly5axZMkSbrnlFubNm0dgYOCM784MBgP19fU8+uijYjNZpVKJVCoVA5vOrrE6f/58cnJyKCgo4Gtf+xrJycmft7LLl9X+OqOhwm63m5dffpm9e/eyfft2NBoNjzzyCHfeeSdJSUkzeamLotPp2L9/P++8847YlSU5OZnXXnuN/Px8QkJCZiWAZGJigtHRUUZHRzGbzXz66ae0t7fT399PbW0tCQkJLF68mJSUFLKyskhMTEStVhMVFSW2rJpJPK35zGYz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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "\n",
    "# 查看数字3和数字5的例子\n",
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); \n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); \n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223);\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); \n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
       "           weights='uniform')"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= 7)\n",
    "y_train_odd = (y_train % 2 == 1)\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True]])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 多输出分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 增加噪声，目标将图片还原为原始图片 创建训练集和测试集\n",
    "noise = np.random.randint(0, 100, (len(X_train), 784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = np.random.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121);plt.imshow(X_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.subplot(122);plt.imshow(y_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(clean_digit.reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 垃圾邮件分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "SPAM_PATH = os.path.join(\"datasets\", \"spam\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "HAM_DIR = os.path.join(SPAM_PATH, \"easy_ham\")\n",
    "SPAM_DIR = os.path.join(SPAM_PATH, \"spam\")\n",
    "ham_filenames = [name for name in sorted(os.listdir(HAM_DIR)) if len(name) > 20]\n",
    "spam_filenames = [name for name in sorted(os.listdir(SPAM_DIR)) if len(name) > 20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [],
   "source": [
    "import email\n",
    "import email.policy\n",
    "\n",
    "def load_email(is_spam, filename, spam_path=SPAM_PATH):\n",
    "    directory = \"spam\" if is_spam else \"easy_ham\"\n",
    "    with open(os.path.join(spam_path, directory, filename), \"rb\") as f:\n",
    "        return email.parser.BytesParser(policy=email.policy.default).parse(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Martin A posted:\n",
      "Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the\n",
      " limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the\n",
      " Mount Athos monastic community, was ideal for the patriotic sculpture. \n",
      " \n",
      " As well as Alexander's granite features, 240 ft high and 170 ft wide, a\n",
      " museum, a restored amphitheatre and car park for admiring crowds are\n",
      "planned\n",
      "---------------------\n",
      "So is this mountain limestone or granite?\n",
      "If it's limestone, it'll weather pretty fast.\n",
      "\n",
      "------------------------ Yahoo! Groups Sponsor ---------------------~-->\n",
      "4 DVDs Free +s&p Join Now\n",
      "http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM\n",
      "---------------------------------------------------------------------~->\n",
      "\n",
      "To unsubscribe from this group, send an email to:\n",
      "forteana-unsubscribe@egroups.com\n",
      "\n",
      " \n",
      "\n",
      "Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/\n"
     ]
    }
   ],
   "source": [
    "ham_emails = [load_email(is_spam=False, filename=name) for name in ham_filenames]\n",
    "spam_emails = [load_email(is_spam=True, filename=name) for name in spam_filenames]\n",
    "print(ham_emails[1].get_content().strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help wanted.  We are a 14 year old fortune 500 company, that is\n",
      "growing at a tremendous rate.  We are looking for individuals who\n",
      "want to work from home.\n",
      "\n",
      "This is an opportunity to make an excellent income.  No experience\n",
      "is required.  We will train you.\n",
      "\n",
      "So if you are looking to be employed from home with a career that has\n",
      "vast opportunities, then go:\n",
      "\n",
      "http://www.basetel.com/wealthnow\n",
      "\n",
      "We are looking for energetic and self motivated people.  If that is you\n",
      "than click on the link and fill out the form, and one of our\n",
      "employement specialist will contact you.\n",
      "\n",
      "To be removed from our link simple go to:\n",
      "\n",
      "http://www.basetel.com/remove.html\n",
      "\n",
      "\n",
      "4139vOLW7-758DoDY1425FRhM1-764SMFc8513fCsLl40\n"
     ]
    }
   ],
   "source": [
    "print(spam_emails[6].get_content().strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# 查看邮件的各种类型的结构：\n",
    "def get_email_structure(email):\n",
    "    if isinstance(email, str):\n",
    "        return email\n",
    "    payload = email.get_payload()\n",
    "    if isinstance(payload, list):\n",
    "        return \"multipart({})\".format(\", \".join([\n",
    "            get_email_structure(sub_email)\n",
    "            for sub_email in payload\n",
    "        ]))\n",
    "    else:\n",
    "        return email.get_content_type()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({1: 1, 4: 2, 2: 3, 3: 2})"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from collections import Counter\n",
    "\n",
    "a = [1,4,2,3,2,3,4,2]  \n",
    " \n",
    "b = Counter(a) #求数组中每个数字出现了几次\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import Counter\n",
    "\n",
    "def structures_counter(emails):\n",
    "    structures = Counter()\n",
    "    for email in emails:\n",
    "        structure = get_email_structure(email)\n",
    "        structures[structure] += 1\n",
    "    return structures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 2408),\n",
       " ('multipart(text/plain, application/pgp-signature)', 66),\n",
       " ('multipart(text/plain, text/html)', 8),\n",
       " ('multipart(text/plain, text/plain)', 4),\n",
       " ('multipart(text/plain)', 3),\n",
       " ('multipart(text/plain, application/octet-stream)', 2),\n",
       " ('multipart(text/plain, text/enriched)', 1),\n",
       " ('multipart(text/plain, application/ms-tnef, text/plain)', 1),\n",
       " ('multipart(multipart(text/plain, text/plain, text/plain), application/pgp-signature)',\n",
       "  1),\n",
       " ('multipart(text/plain, video/mng)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain))', 1),\n",
       " ('multipart(text/plain, application/x-pkcs7-signature)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), text/rfc822-headers)',\n",
       "  1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), multipart(multipart(text/plain, application/x-pkcs7-signature)))',\n",
       "  1),\n",
       " ('multipart(text/plain, application/x-java-applet)', 1)]"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "structures_counter(ham_emails).most_common()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 218),\n",
       " ('text/html', 183),\n",
       " ('multipart(text/plain, text/html)', 45),\n",
       " ('multipart(text/html)', 20),\n",
       " ('multipart(text/plain)', 19),\n",
       " ('multipart(multipart(text/html))', 5),\n",
       " ('multipart(text/plain, image/jpeg)', 3),\n",
       " ('multipart(text/html, application/octet-stream)', 2),\n",
       " ('multipart(text/plain, application/octet-stream)', 1),\n",
       " ('multipart(text/html, text/plain)', 1),\n",
       " ('multipart(multipart(text/html), application/octet-stream, image/jpeg)', 1),\n",
       " ('multipart(multipart(text/plain, text/html), image/gif)', 1),\n",
       " ('multipart/alternative', 1)]"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "structures_counter(spam_emails).most_common()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Return-Path : <12a1mailbot1@web.de>\n",
      "Delivered-To : zzzz@localhost.spamassassin.taint.org\n",
      "Received : from localhost (localhost [127.0.0.1])\tby phobos.labs.spamassassin.taint.org (Postfix) with ESMTP id 136B943C32\tfor <zzzz@localhost>; Thu, 22 Aug 2002 08:17:21 -0400 (EDT)\n",
      "Received : from mail.webnote.net [193.120.211.219]\tby localhost with POP3 (fetchmail-5.9.0)\tfor zzzz@localhost (single-drop); Thu, 22 Aug 2002 13:17:21 +0100 (IST)\n",
      "Received : from dd_it7 ([210.97.77.167])\tby webnote.net (8.9.3/8.9.3) with ESMTP id NAA04623\tfor <zzzz@spamassassin.taint.org>; Thu, 22 Aug 2002 13:09:41 +0100\n",
      "From : 12a1mailbot1@web.de\n",
      "Received : from r-smtp.korea.com - 203.122.2.197 by dd_it7  with Microsoft SMTPSVC(5.5.1775.675.6);\t Sat, 24 Aug 2002 09:42:10 +0900\n",
      "To : dcek1a1@netsgo.com\n",
      "Subject : Life Insurance - Why Pay More?\n",
      "Date : Wed, 21 Aug 2002 20:31:57 -1600\n",
      "MIME-Version : 1.0\n",
      "Message-ID : <0103c1042001882DD_IT7@dd_it7>\n",
      "Content-Type : text/html; charset=\"iso-8859-1\"\n",
      "Content-Transfer-Encoding : quoted-printable\n"
     ]
    }
   ],
   "source": [
    "# 查看邮件头\n",
    "for header, value in spam_emails[0].items():\n",
    "    print(header,\":\",value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Life Insurance - Why Pay More?'"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spam_emails[0][\"Subject\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 拆分训练集和测试集合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X = np.array(ham_emails + spam_emails)\n",
    "y = np.array([0] * len(ham_emails) + [1] * len(spam_emails))\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "from html import unescape\n",
    "\n",
    "def html_to_plain_text(html):\n",
    "    text = re.sub('<head.*?>.*?</head>', '', html, flags=re.M | re.S | re.I)\n",
    "    text = re.sub('<a\\s.*?>', ' HYPERLINK ', text, flags=re.M | re.S | re.I)\n",
    "    text = re.sub('<.*?>', '', text, flags=re.M | re.S)\n",
    "    text = re.sub(r'(\\s*\\n)+', '\\n', text, flags=re.M | re.S)\n",
    "    return unescape(text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<HTML><HEAD><TITLE></TITLE><META http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\"><STYLE>A:link {TEX-DECORATION: none}A:active {TEXT-DECORATION: none}A:visited {TEXT-DECORATION: none}A:hover {COLOR: #0033ff; TEXT-DECORATION: underline}</STYLE><META content=\"MSHTML 6.00.2713.1100\" name=\"GENERATOR\"></HEAD>\n",
      "<BODY text=\"#000000\" vLink=\"#0033ff\" link=\"#0033ff\" bgColor=\"#CCCC99\"><TABLE borderColor=\"#660000\" cellSpacing=\"0\" cellPadding=\"0\" border=\"0\" width=\"100%\"><TR><TD bgColor=\"#CCCC99\" valign=\"top\" colspan=\"2\" height=\"27\">\n",
      "<font size=\"6\" face=\"Arial, Helvetica, sans-serif\" color=\"#660000\">\n",
      "<b>OTC</b></font></TD></TR><TR><TD height=\"2\" bgcolor=\"#6a694f\">\n",
      "<font size=\"5\" face=\"Times New Roman, Times, serif\" color=\"#FFFFFF\">\n",
      "<b>&nbsp;Newsletter</b></font></TD><TD height=\"2\" bgcolor=\"#6a694f\"><div align=\"right\"><font color=\"#FFFFFF\">\n",
      "<b>Discover Tomorrow's Winners&nbsp;</b></font></div></TD></TR><TR><TD height=\"25\" colspan=\"2\" bgcolor=\"#CCCC99\"><table width=\"100%\" border=\"0\"  ...\n"
     ]
    }
   ],
   "source": [
    "html_spam_emails = [email for email in X_train[y_train==1]\n",
    "                    if get_email_structure(email) == \"text/html\"]\n",
    "sample_html_spam = html_spam_emails[7]\n",
    "print(sample_html_spam.get_content().strip()[:1000], \"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Watch for analyst \"Strong Buy Recommendations\" and several advisory newsletters picking CBYI.  CBYI has filed to be traded on the OTCBB, share prices historically INCREASE when companies get listed on this larger trading exchange. CBYI is trading around 25 cents and should skyrocket to $2.66 - $3.25 a share in the near future.\n",
      "Put CBYI on your watch list, acquire a position TODAY.\n",
      "REASONS TO INVEST IN CBYI\n",
      "A profitable company and is on track to beat ALL earnings estimates!\n",
      "One of the FASTEST growing distributors in environmental & safety equipment instruments.\n",
      "Excellent management team, several EXCLUSIVE contracts.  IMPRESSIVE client list including the U.S. Air Force, Anheuser-Busch, Chevron Refining and Mitsubishi Heavy Industries, GE-Energy & Environmental Research.\n",
      "RAPIDLY GROWING INDUSTRY\n",
      "Industry revenues exceed $900 million, estimates indicate that there could be as much as $25 billi ...\n"
     ]
    }
   ],
   "source": [
    "print(html_to_plain_text(sample_html_spam.get_content())[:1000], \"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "def email_to_text(email):\n",
    "    html = None\n",
    "    for part in email.walk():\n",
    "        ctype = part.get_content_type()\n",
    "        if not ctype in (\"text/plain\", \"text/html\"):\n",
    "            continue\n",
    "        try:\n",
    "            content = part.get_content()\n",
    "        except: # 解决编码问题\n",
    "            content = str(part.get_payload())\n",
    "        if ctype == \"text/plain\":\n",
    "            return content\n",
    "        else:\n",
    "            html = content\n",
    "    if html:\n",
    "        return html_to_plain_text(html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Wat ...\n"
     ]
    }
   ],
   "source": [
    "print(email_to_text(sample_html_spam)[:100], \"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Computations => comput\n",
      "Computation => comput\n",
      "Computing => comput\n",
      "Computed => comput\n",
      "Compute => comput\n",
      "Compulsive => compuls\n"
     ]
    }
   ],
   "source": [
    "import nltk\n",
    "from urlextract import URLExtract\n",
    "\n",
    "try:\n",
    "    import nltk\n",
    "\n",
    "    stemmer = nltk.PorterStemmer()\n",
    "    for word in (\"Computations\", \"Computation\", \"Computing\", \"Computed\", \"Compute\", \"Compulsive\"):\n",
    "        print(word, \"=>\", stemmer.stem(word))\n",
    "except ImportError:\n",
    "    print(\"Error: stemming requires the NLTK module.\")\n",
    "    stemmer = None\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 将所有处理整合到一个转换器中，使用它将电子邮件转换为文字计数器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator, TransformerMixin\n",
    "\n",
    "class EmailToWordCounterTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, strip_headers=True, lower_case=True, remove_punctuation=True,\n",
    "                 replace_urls=True, replace_numbers=True,  stemming=True):\n",
    "        self.strip_headers = strip_headers\n",
    "        self.lower_case = lower_case\n",
    "        self.remove_punctuation = remove_punctuation\n",
    "        self.replace_urls = replace_urls\n",
    "        self.replace_numbers = replace_numbers\n",
    "        self.stemming = stemming\n",
    "    def fit(self, X, y=None):\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        X_transformed = []\n",
    "        for email in X:\n",
    "            text = email_to_text(email) or \"\"\n",
    "            if self.lower_case:\n",
    "                text = text.lower()\n",
    "            if self.replace_urls:\n",
    "                extractor = URLExtract()\n",
    "                urls = list(set(extractor.find_urls(text)))\n",
    "                urls.sort(key=lambda url: len(url), reverse=True)\n",
    "                for url in urls:  # 替换url 为 ‘URL’\n",
    "                    text = text.replace(url, \" URL \")\n",
    "            if self.replace_numbers:  # 替换数字\n",
    "                text = re.sub(r'\\d+(?:\\.\\d*(?:[eE]\\d+))?', 'NUMBER', text)\n",
    "            if self.remove_punctuation:  # 删除标点符号\n",
    "                text = re.sub(r'\\W+', ' ', text, flags=re.M)\n",
    "            word_counts = Counter(text.split())\n",
    "            if self.stemming and stemmer is not None:\n",
    "                stemmed_word_counts = Counter()\n",
    "                for word, count in word_counts.items():\n",
    "                    stemmed_word = stemmer.stem(word)\n",
    "                    stemmed_word_counts[stemmed_word] += count\n",
    "                word_counts = stemmed_word_counts\n",
    "            X_transformed.append(word_counts)\n",
    "        return np.array(X_transformed)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([Counter({'chuck': 1, 'murcko': 1, 'wrote': 1, 'stuff': 1, 'yawn': 1, 'r': 1}),\n",
       "       Counter({'the': 11, 'of': 9, 'and': 8, 'all': 3, 'christian': 3, 'to': 3, 'by': 3, 'jefferson': 2, 'i': 2, 'have': 2, 'superstit': 2, 'one': 2, 'on': 2, 'been': 2, 'ha': 2, 'half': 2, 'rogueri': 2, 'teach': 2, 'jesu': 2, 'some': 1, 'interest': 1, 'quot': 1, 'url': 1, 'thoma': 1, 'examin': 1, 'known': 1, 'word': 1, 'do': 1, 'not': 1, 'find': 1, 'in': 1, 'our': 1, 'particular': 1, 'redeem': 1, 'featur': 1, 'they': 1, 'are': 1, 'alik': 1, 'found': 1, 'fabl': 1, 'mytholog': 1, 'million': 1, 'innoc': 1, 'men': 1, 'women': 1, 'children': 1, 'sinc': 1, 'introduct': 1, 'burnt': 1, 'tortur': 1, 'fine': 1, 'imprison': 1, 'what': 1, 'effect': 1, 'thi': 1, 'coercion': 1, 'make': 1, 'world': 1, 'fool': 1, 'other': 1, 'hypocrit': 1, 'support': 1, 'error': 1, 'over': 1, 'earth': 1, 'six': 1, 'histor': 1, 'american': 1, 'john': 1, 'e': 1, 'remsburg': 1, 'letter': 1, 'william': 1, 'short': 1, 'again': 1, 'becom': 1, 'most': 1, 'pervert': 1, 'system': 1, 'that': 1, 'ever': 1, 'shone': 1, 'man': 1, 'absurd': 1, 'untruth': 1, 'were': 1, 'perpetr': 1, 'upon': 1, 'a': 1, 'larg': 1, 'band': 1, 'dupe': 1, 'import': 1, 'led': 1, 'paul': 1, 'first': 1, 'great': 1, 'corrupt': 1}),\n",
       "       Counter({'url': 4, 's': 3, 'group': 3, 'to': 3, 'in': 2, 'forteana': 2, 'martin': 2, 'an': 2, 'and': 2, 'we': 2, 'is': 2, 'yahoo': 2, 'unsubscrib': 2, 'y': 1, 'adamson': 1, 'wrote': 1, 'for': 1, 'altern': 1, 'rather': 1, 'more': 1, 'factual': 1, 'base': 1, 'rundown': 1, 'on': 1, 'hamza': 1, 'career': 1, 'includ': 1, 'hi': 1, 'belief': 1, 'that': 1, 'all': 1, 'non': 1, 'muslim': 1, 'yemen': 1, 'should': 1, 'be': 1, 'murder': 1, 'outright': 1, 'know': 1, 'how': 1, 'unbias': 1, 'memri': 1, 'don': 1, 't': 1, 'html': 1, 'rob': 1, 'sponsor': 1, 'number': 1, 'dvd': 1, 'free': 1, 'p': 1, 'join': 1, 'now': 1, 'from': 1, 'thi': 1, 'send': 1, 'email': 1, 'egroup': 1, 'com': 1, 'your': 1, 'use': 1, 'of': 1, 'subject': 1})],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_few = X_train[:3]\n",
    "X_few_wordcounts = EmailToWordCounterTransformer().fit_transform(X_few)\n",
    "X_few_wordcounts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建转换器 将单词计数转换为向量--稀疏矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.sparse import csr_matrix\n",
    "\n",
    "class WordCounterToVectorTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, vocabulary_size = 1000):\n",
    "        self.vocabulary_size = vocabulary_size  # 词汇量\n",
    "    def fit(self, X, y = None):\n",
    "        total_count = Counter()\n",
    "        for word_count in X:\n",
    "            for word, count in word_count.items():\n",
    "                total_count[word] += min(count, 10)\n",
    "        most_common = total_count.most_common()[:self.vocabulary_size]\n",
    "        self.most_common_ = most_common\n",
    "        self.vocabulary_ = {word: index + 1 for index, (word, count) in enumerate(most_common)}\n",
    "        return self\n",
    "    def transform(self, X, y = None):\n",
    "        rows = []\n",
    "        cols = []\n",
    "        data = []\n",
    "        for row, word_count in enumerate(X):\n",
    "            for word, count in word_count.items():\n",
    "                rows.append(row) # 训练集 实例个数\n",
    "                cols.append(self.vocabulary_.get(word, 0)) # 取得单词在词汇表中的索引位置，0代表未出现在词汇表中\n",
    "                data.append(count)\n",
    "        return csr_matrix((data, (rows, cols)), shape=(len(X), self.vocabulary_size + 1)) # 输出稀疏矩阵 +1因为第一列要显示未出现在词汇表中的单词统计数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 11)"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer = WordCounterToVectorTransformer(vocabulary_size=10)\n",
    "X_few_vectors = vocab_transformer.fit_transform(X_few_wordcounts)\n",
    "X_few_vectors.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],\n",
       "       [99, 11,  9,  8,  3,  1,  3,  1,  3,  2,  3],\n",
       "       [67,  0,  1,  2,  3,  4,  1,  2,  0,  1,  0]])"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_few_vectors.toarray()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'the': 1,\n",
       " 'of': 2,\n",
       " 'and': 3,\n",
       " 'to': 4,\n",
       " 'url': 5,\n",
       " 'all': 6,\n",
       " 'in': 7,\n",
       " 'christian': 8,\n",
       " 'on': 9,\n",
       " 'by': 10}"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer.vocabulary_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "## 转换整个数据集\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "preprocess_pipeline = Pipeline([\n",
    "    (\"email_to_wordcount\", EmailToWordCounterTransformer()),\n",
    "    (\"wordcount_to_vector\", WordCounterToVectorTransformer()),\n",
    "])\n",
    "\n",
    "X_train_transformed = preprocess_pipeline.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.98125, total=   0.1s\n",
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.98375, total=   0.1s\n",
      "[CV]  ................................................................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.1s remaining:    0.0s\n",
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed:    0.2s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV] .................................. , score=0.99125, total=   0.3s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed:    0.5s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.9854166666666666"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "log_clf = LogisticRegression(solver=\"liblinear\", random_state=42) # 采用逻辑回归分类器\n",
    "score = cross_val_score(log_clf, X_train_transformed, y_train, cv=3, verbose=3)\n",
    "score.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 可以尝试多个模型，选择最好的模型，并使用交叉验证对它们进行微调"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "精度: 96.88%\n",
      "召回: 97.89%\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "X_test_transformed = preprocess_pipeline.transform(X_test)\n",
    "\n",
    "log_clf = LogisticRegression(solver=\"liblinear\", random_state=42)\n",
    "log_clf.fit(X_train_transformed, y_train)\n",
    "\n",
    "y_pred = log_clf.predict(X_test_transformed)\n",
    "\n",
    "print(\"精度: {:.2f}%\".format(100 * precision_score(y_test, y_pred)))\n",
    "print(\"召回: {:.2f}%\".format(100 * recall_score(y_test, y_pred)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
